home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / C++ / Applications / Nuntius 1.2 / src / Nuntius / UnusedFiles / UResFile.cp next >
Encoding:
Text File  |  1994-02-20  |  6.6 KB  |  346 lines  |  [TEXT/MPS ]

  1. // Copyright © 1992 Peter Speck, speck@dat.ruc.dk. All rights reserved.
  2. // UResFile.h
  3.  
  4. #ifndef __RESOURCES__
  5. #include <Resources.h>
  6. #endif
  7.  
  8. #ifndef __ERRORS__
  9. #include <Errors.h>
  10. #endif
  11.  
  12. #include "UResFile.h"
  13.  
  14. #pragma segment Nuntius
  15.  
  16. TResFile::TResFile()
  17. {
  18. }
  19.  
  20. pascal void TResFile::Initialize()
  21. {
  22.     inherited::Initialize();
  23. }
  24.  
  25. pascal void TResFile::IResFile(OSType itsFileType, OSType itsCreator, 
  26.                                 Boolean usesDataFork, ResourceUsage usesRsrcFork,
  27.                               Boolean keepsDataOpen, Boolean keepsRsrcOpen)
  28. {
  29.     inherited::IFile(itsFileType, itsCreator, 
  30.                         usesDataFork, usesRsrcFork, keepsDataOpen, keepsRsrcOpen);
  31. }
  32.  
  33. pascal void TResFile::Free()
  34. {
  35.     inherited::Free(); // closes file
  36. }
  37.  
  38. pascal OSErr TResFile::CloseRsrcFork()
  39. {
  40.     short errNo = inherited::CloseRsrcFork();
  41.     FlushVolume();
  42.     return errNo;
  43. }
  44.     
  45. void TResFile::UpdateFile()
  46. {
  47.     FailInfo fi;
  48.     short oldRefNum = UseResource();
  49.     VOLATILE(oldRefNum);
  50.     if (fi.Try()) {
  51.         if (IsRsrcForkOpen()) {
  52.             UpdateResource();
  53.             FlushVolume();
  54.         }
  55.         fi.Success();
  56.     }
  57.     else { // fail
  58.         UseResFile(oldRefNum);
  59.         fi.ReSignal();
  60.     }
  61. }
  62.  
  63. Handle TResFile::GetResource(ResType theType, short theID)
  64. {
  65.     FailInfo fi;
  66.     short oldRefNum = UseResource();
  67.     VOLATILE(oldRefNum);
  68.     if (fi.Try()) {
  69.         Handle H = ::Get1Resource(theType, theID);
  70.         FailNILResource(H);
  71.         UseResFile(oldRefNum);
  72.         fi.Success();
  73.         return H;
  74.     }
  75.     else { // fail
  76.         UseResFile(oldRefNum);
  77.         fi.ReSignal();
  78.     }
  79. }
  80.  
  81. Handle TResFile::GetRes(ResType theType, ConstCStr255Param name)
  82. {
  83.     FailInfo fi;
  84.     short oldRefNum = UseResource();
  85.     VOLATILE(oldRefNum);
  86.     if (fi.Try()) {
  87.         Handle H = ::Get1NamedResource(theType, name);
  88.         FailNILResource(H);
  89.         UseResFile(oldRefNum);
  90.         fi.Success();
  91.         return H;
  92.     }
  93.     else { // fail
  94.         UseResFile(oldRefNum);
  95.         fi.ReSignal();
  96.     }
  97. }
  98.  
  99. Boolean TResFile::GetResBool(ResType theType, ConstCStr255Param name, Handle &H)
  100. {
  101.     FailInfo fi;
  102.     short oldRefNum = UseResource();
  103.     VOLATILE(oldRefNum);
  104.     if (fi.Try()) {
  105.         H = ::Get1NamedResource(theType, name);
  106.         short errNo = ResError();
  107.         Boolean gotIt;
  108.         if (H == nil && (errNo == noErr || errNo == resNotFound)) {
  109.             gotIt = false;
  110.         }
  111.         else {
  112.             FailNILResource(H);
  113.             gotIt = true;
  114.         }
  115.         UseResFile(oldRefNum);
  116.         fi.Success();
  117.         return gotIt;
  118.     }
  119.     else { // fail
  120.         UseResFile(oldRefNum);
  121.         fi.ReSignal();
  122.     }
  123. }
  124.  
  125. Boolean TResFile::GetResourceBool(ResType theType, short theID, Handle &H)
  126. {
  127.     FailInfo fi;
  128.     short oldRefNum = UseResource();
  129.     VOLATILE(oldRefNum);
  130.     if (fi.Try()) {
  131.         H = ::Get1Resource(theType, theID);
  132.         short errNo = ResError();
  133.         Boolean gotIt;
  134.         if (H == nil && (errNo == noErr || errNo == resNotFound)) {
  135.             gotIt = false;
  136.         }
  137.         else {
  138.             FailNILResource(H);
  139.             gotIt = true;
  140.         }
  141.         UseResFile(oldRefNum);
  142.         fi.Success();
  143.         return gotIt;
  144.     }
  145.     else { // fail
  146.         UseResFile(oldRefNum);
  147.         fi.ReSignal();
  148.     }
  149. }
  150.  
  151.  
  152. void TResFile::RemoveRes(ResType theType, ConstCStr255Param name)
  153. {
  154.     FailInfo fi;
  155.     short oldRefNum = UseResource();
  156.     VOLATILE(oldRefNum);
  157.     if (fi.Try()) {
  158.         ::SetResLoad(false);
  159.         Handle H = ::Get1NamedResource(theType, name);
  160.         short errNo = ResError();
  161.         ::SetResLoad(true);
  162.         if (H == nil && (errNo == noErr || errNo == resNotFound)) {
  163.             // did not exist
  164.         }
  165.         else {
  166.             FailNILResource(H);
  167.             RmveResource(H); // H _must_ belong to current CurResFile (se IM: The ResourceMgr)
  168.         }
  169.         UseResFile(oldRefNum);
  170.         fi.Success();
  171.     }
  172.     else { // fail
  173.         UseResFile(oldRefNum);
  174.         fi.ReSignal();
  175.     }
  176. }
  177.  
  178. Boolean TResFile::ResExist(ResType theType, short theID)
  179. {
  180.     FailInfo fi;
  181.     short oldRefNum = UseResource();
  182.     VOLATILE(oldRefNum);
  183.     if (fi.Try()) {
  184.         ::SetResLoad(false);
  185.         Handle H = ::Get1Resource(theType, theID);
  186.         short errNo = ResError();
  187.         ::SetResLoad(true);
  188.         Boolean doesExist;
  189.         if (H == nil && (errNo == noErr || errNo == resNotFound)) {
  190.             doesExist = false;
  191.         }
  192.         else {
  193.             FailNILResource(H);
  194.             doesExist = true;
  195.         }
  196.         UseResFile(oldRefNum);
  197.         fi.Success();
  198.         return doesExist;
  199.     }
  200.     else { // fail
  201.         UseResFile(oldRefNum);
  202.         fi.ReSignal();
  203.     }
  204. }
  205.  
  206. Boolean TResFile::NamedResExist(ResType theType, ConstCStr255Param name)
  207. {
  208.     FailInfo fi;
  209.     short oldRefNum = UseResource();
  210.     VOLATILE(oldRefNum);
  211.     if (fi.Try()) {
  212.         ::SetResLoad(false);
  213.         Handle H = ::Get1NamedResource(theType, name);
  214.         short errNo = ResError();
  215.         ::SetResLoad(true);
  216.         Boolean doesExist;
  217.         if (H == nil && (errNo == noErr || errNo == resNotFound)) {
  218.             doesExist = false;
  219.         }
  220.         else {
  221.             FailNILResource(H);
  222.             doesExist = true;
  223.         }
  224.         UseResFile(oldRefNum);
  225.         fi.Success();
  226.         return doesExist;
  227.     }
  228.     else { // fail
  229.         UseResFile(oldRefNum);
  230.         fi.ReSignal();
  231.     }
  232. }
  233.  
  234. void TResFile::AddResource(void *theResource, ResType theType, short theID, ConstCStr255Param name)
  235. {
  236.     FailInfo fi;
  237.     short oldRefNum = UseResource();
  238.     VOLATILE(oldRefNum);
  239.     if (fi.Try()) {
  240.         ::AddResource(Handle(theResource), theType, theID, name);
  241.         FailResError();
  242.         ::WriteResource(Handle(theResource));
  243.         FailResError();
  244.         UseResFile(oldRefNum);
  245.         fi.Success();
  246.     }
  247.     else {
  248.         UseResFile(oldRefNum);
  249.         fi.ReSignal();
  250.     }
  251. }
  252.  
  253. void TResFile::AddRes(void *theResource, ResType theType, ConstCStr255Param name)
  254. {
  255.     short id;
  256.     do id = UniqueID(theType); while (id < 1024);
  257.     AddResource(theResource, theType, id, name);
  258. }
  259.  
  260. void TResFile::UpdateRes(void *theResource)
  261. {
  262.     ::ChangedResource(Handle(theResource));
  263.     FailResError();
  264.     ::WriteResource(Handle(theResource));
  265.     FailResError();
  266. }    
  267.  
  268. void TResFile::ReleaseResource(void *theResource)
  269. {
  270.     ::ReleaseResource(Handle(theResource));
  271.     FailResError();
  272. }
  273.  
  274. void TResFile::DetachResource(void *theResource)
  275. {
  276.     ::DetachResource(Handle(theResource));
  277.     FailResError();
  278. }
  279.  
  280. void TResFile::RemoveAllResources()
  281. {
  282.     FailInfo fi;
  283.     short oldRefNum = UseResource();
  284.     VOLATILE(oldRefNum);
  285.     if (fi.Try()) {
  286.         // Apple still have not supplied a function to this!
  287.         // so we remove _one_ resource at a time    
  288.         while (Count1Types() > 0) {
  289.             ResType theType;
  290.             Get1IndType(theType, 1);
  291.             while (Count1Resources(theType) > 0) {
  292.                 Handle H;
  293.                 SetResLoad(false);
  294.                 H = Get1IndResource(theType, 1);
  295.                 short err = ResError();
  296.                 SetResLoad(true);
  297.                 FailNILResource(H);
  298.                 RmveResource(H);
  299.                 FailResError();
  300.             }
  301.         }
  302.         UseResFile(oldRefNum);
  303.         fi.Success();
  304.     }
  305.     else {
  306.         UseResFile(oldRefNum);
  307.         fi.ReSignal();
  308.     }
  309. }
  310.  
  311. short TResFile::UniqueID(ResType theType)
  312. {
  313.     short id;
  314.     do 
  315.     {
  316.         id = UniqueID(theType); 
  317.     } while (id < 1024);
  318.     return id;
  319. }
  320.     
  321. void TResFile::RemoveResource(ResType theType, short theID)
  322. {
  323.     FailInfo fi;
  324.     short oldRefNum = UseResource();
  325.     VOLATILE(oldRefNum);
  326.     if (fi.Try()) {
  327.         SetResLoad(false);
  328.         Handle H = ::Get1Resource(theType, theID);
  329.         SetResLoad(true);
  330.         if (H == nil && ResError() != noErr && ResError() != resNotFound)
  331.         {
  332.             FailNILResource(H);
  333.             ::RmveResource(H);
  334.             DisposeHandle(H);
  335.             H = nil;
  336.         }
  337.         UseResFile(oldRefNum);
  338.         fi.Success();
  339.         return;
  340.     }
  341.     else { // fail
  342.         UseResFile(oldRefNum);
  343.         fi.ReSignal();
  344.     }
  345. }
  346.